// 版权归Epic Games, Inc.所有。保留所有权利。

#pragma once

#include "Components/ControllerComponent.h"

#include "LyraIndicatorManagerComponent.generated.h"

#define UE_API LYRAGAME_API

class AController;
class UIndicatorDescriptor;
class UObject;
struct FFrame;

/**
 * @class ULyraIndicatorManagerComponent
 * 指示器管理器组件类
 */
UCLASS(MinimalAPI, BlueprintType, Blueprintable)
class ULyraIndicatorManagerComponent : public UControllerComponent
{
	GENERATED_BODY() // 生成主体

public:
	UE_API ULyraIndicatorManagerComponent(const FObjectInitializer& ObjectInitializer); // 构造函数

	/**
	 * 获取控制器的指示器管理器组件
	 * @param Controller 控制器
	 * @return 指示器管理器组件
	 */
	static UE_API ULyraIndicatorManagerComponent* GetComponent(AController* Controller);

	/**
	 * 添加指示器
	 * @param IndicatorDescriptor 指示器描述符
	 */
	UFUNCTION(BlueprintCallable, Category = Indicator)
	UE_API void AddIndicator(UIndicatorDescriptor* IndicatorDescriptor);
	
	/**
	 * 移除指示器
	 * @param IndicatorDescriptor 指示器描述符
	 */
	UFUNCTION(BlueprintCallable, Category = Indicator)
	UE_API void RemoveIndicator(UIndicatorDescriptor* IndicatorDescriptor);

	// 声明指示器事件，参数为指示器描述符
	DECLARE_EVENT_OneParam(ULyraIndicatorManagerComponent, FIndicatorEvent, UIndicatorDescriptor* Descriptor)
	FIndicatorEvent OnIndicatorAdded; // 指示器添加事件
	FIndicatorEvent OnIndicatorRemoved; // 指示器移除事件

	/**
	 * 获取所有指示器
	 * @return 指示器数组引用
	 */
	const TArray<UIndicatorDescriptor*>& GetIndicators() const { return Indicators; }

private:
	UPROPERTY()
	TArray<TObjectPtr<UIndicatorDescriptor>> Indicators; // 指示器对象指针数组
};

#undef UE_API